type token =
  | INT of (int)
  | PLUS
  | MINUS
  | MUL
  | DIV
  | MATCH
  | WITH
  | PIPE
  | ARROW
  | NEW_LINE
  | LPAREN
  | RPAREN
  | END
  | IDENT of (string)
  | FUN
  | FUN_ARROW
  | LET
  | IN
  | EQ
  | REC
  | EOF

open Parsing;;
# 2 "parser.mly"
 open Ast;;
 let parse_error s = (* Called by the parser function on error *)
 print_endline  s;
 flush stdout
# 31 "parser.ml"
let yytransl_const = [|
  258 (* PLUS *);
  259 (* MINUS *);
  260 (* MUL *);
  261 (* DIV *);
  262 (* MATCH *);
  263 (* WITH *);
  264 (* PIPE *);
  265 (* ARROW *);
  266 (* NEW_LINE *);
  267 (* LPAREN *);
  268 (* RPAREN *);
  269 (* END *);
  271 (* FUN *);
  272 (* FUN_ARROW *);
  273 (* LET *);
  274 (* IN *);
  275 (* EQ *);
  276 (* REC *);
    0 (* EOF *);
    0|]

let yytransl_block = [|
  257 (* INT *);
  270 (* IDENT *);
    0|]

let yylhs = "\255\255\
\002\000\002\000\003\000\003\000\003\000\005\000\005\000\004\000\
\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
\006\000\006\000\007\000\001\000\000\000"

let yylen = "\002\000\
\001\000\001\000\001\000\001\000\003\000\001\000\002\000\001\000\
\003\000\003\000\003\000\003\000\004\000\005\000\006\000\008\000\
\002\000\001\000\004\000\002\000\002\000"

let yydefred = "\000\000\
\000\000\000\000\004\000\000\000\000\000\003\000\000\000\000\000\
\021\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\020\000\007\000\000\000\
\005\000\000\000\000\000\000\000\000\000\000\000\009\000\010\000\
\000\000\000\000\000\000\013\000\000\000\000\000\002\000\001\000\
\000\000\014\000\017\000\000\000\000\000\000\000\015\000\000\000\
\000\000\000\000\016\000"

let yydgoto = "\002\000\
\009\000\041\000\010\000\011\000\012\000\034\000\035\000"

let yysindex = "\013\000\
\020\255\000\000\000\000\020\255\020\255\000\000\014\255\009\255\
\000\000\000\000\027\000\255\254\053\255\047\255\016\255\011\255\
\019\255\020\255\020\255\020\255\020\255\000\000\000\000\028\255\
\000\000\020\255\020\255\031\255\007\255\007\255\000\000\000\000\
\008\255\033\255\028\255\000\000\002\255\034\255\000\000\000\000\
\038\255\000\000\000\000\020\255\020\255\020\255\000\000\036\255\
\061\255\020\255\000\000"

let yyrindex = "\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\008\000\015\000\000\000\000\000\
\000\000\000\000\048\255\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\054\255\000\000\000\000"

let yygindex = "\000\000\
\000\000\000\000\056\000\254\255\000\000\034\000\000\000"

let yytablesize = 289
let yytable = "\003\000\
\008\000\013\000\014\000\018\000\019\000\020\000\021\000\011\000\
\039\000\005\000\020\000\021\000\006\000\001\000\012\000\029\000\
\030\000\031\000\032\000\044\000\003\000\040\000\016\000\036\000\
\037\000\004\000\022\000\015\000\017\000\027\000\005\000\026\000\
\028\000\006\000\007\000\033\000\008\000\018\000\019\000\020\000\
\021\000\047\000\048\000\049\000\038\000\042\000\046\000\051\000\
\018\000\019\000\020\000\021\000\045\000\050\000\018\000\019\000\
\020\000\021\000\025\000\024\000\018\000\019\000\018\000\019\000\
\020\000\021\000\019\000\023\000\043\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\000\000\000\000\008\000\008\000\008\000\008\000\000\000\008\000\
\008\000\011\000\011\000\000\000\008\000\008\000\011\000\011\000\
\012\000\012\000\008\000\011\000\011\000\012\000\012\000\000\000\
\000\000\011\000\012\000\012\000\018\000\019\000\020\000\021\000\
\012\000"

let yycheck = "\001\001\
\000\000\004\000\005\000\002\001\003\001\004\001\005\001\000\000\
\001\001\011\001\004\001\005\001\014\001\001\000\000\000\018\000\
\019\000\020\000\021\000\018\001\001\001\014\001\014\001\026\000\
\027\000\006\001\000\000\014\001\020\001\019\001\011\001\016\001\
\014\001\014\001\015\001\008\001\017\001\002\001\003\001\004\001\
\005\001\044\000\045\000\046\000\014\001\013\001\009\001\050\000\
\002\001\003\001\004\001\005\001\019\001\018\001\002\001\003\001\
\004\001\005\001\012\001\007\001\013\001\008\001\002\001\003\001\
\004\001\005\001\013\001\012\000\035\000\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
\255\255\255\255\002\001\003\001\004\001\005\001\255\255\007\001\
\008\001\002\001\003\001\255\255\012\001\013\001\007\001\008\001\
\002\001\003\001\018\001\012\001\013\001\007\001\008\001\255\255\
\255\255\018\001\012\001\013\001\002\001\003\001\004\001\005\001\
\018\001"

let yynames_const = "\
  PLUS\000\
  MINUS\000\
  MUL\000\
  DIV\000\
  MATCH\000\
  WITH\000\
  PIPE\000\
  ARROW\000\
  NEW_LINE\000\
  LPAREN\000\
  RPAREN\000\
  END\000\
  FUN\000\
  FUN_ARROW\000\
  LET\000\
  IN\000\
  EQ\000\
  REC\000\
  EOF\000\
  "

let yynames_block = "\
  INT\000\
  IDENT\000\
  "

let yyact = [|
  (fun _ -> failwith "parser")
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in
    Obj.repr(
# 26 "parser.mly"
                                 ( StringPat(_1))
# 215 "parser.ml"
               : Ast.pattern))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : int) in
    Obj.repr(
# 27 "parser.mly"
                           ( IntPat(_1))
# 222 "parser.ml"
               : Ast.pattern))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : string) in
    Obj.repr(
# 30 "parser.mly"
                                 ( StringConst(_1))
# 229 "parser.ml"
               : 'tinyexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : int) in
    Obj.repr(
# 31 "parser.mly"
                           ( IntConst(_1))
# 236 "parser.ml"
               : 'tinyexp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 1 : 'funexp) in
    Obj.repr(
# 32 "parser.mly"
                                  ( _2 )
# 243 "parser.ml"
               : 'tinyexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'tinyexp) in
    Obj.repr(
# 36 "parser.mly"
                                   ( _1)
# 250 "parser.ml"
               : 'appexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'appexp) in
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'tinyexp) in
    Obj.repr(
# 37 "parser.mly"
                                   ( App(_1,_2))
# 258 "parser.ml"
               : 'appexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'appexp) in
    Obj.repr(
# 40 "parser.mly"
                                      ( _1)
# 265 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'funexp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 41 "parser.mly"
                                     ( Binop( Mul, _1, _3))
# 273 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'funexp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 42 "parser.mly"
                                     ( Binop( Div, _1, _3))
# 281 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'funexp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 43 "parser.mly"
                                     ( Binop( Plus, _1, _3))
# 289 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 2 : 'funexp) in
    let _3 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 44 "parser.mly"
                                     ( Binop( Minus,_1, _3))
# 297 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 2 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 45 "parser.mly"
                                     ( Fun( _2,_4))
# 305 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 3 : 'funexp) in
    let _4 = (Parsing.peek_val __caml_parser_env 1 : 'match_exp) in
    Obj.repr(
# 46 "parser.mly"
                                     ( Match(_2,_4))
# 313 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 4 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 2 : 'funexp) in
    let _6 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 47 "parser.mly"
                                     ( Let (_2,_4,_6))
# 322 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _3 = (Parsing.peek_val __caml_parser_env 5 : string) in
    let _4 = (Parsing.peek_val __caml_parser_env 4 : string) in
    let _6 = (Parsing.peek_val __caml_parser_env 2 : 'funexp) in
    let _8 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 48 "parser.mly"
                                          ( LetRec(_3,_4,_6,_8))
# 332 "parser.ml"
               : 'funexp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'match_case) in
    let _2 = (Parsing.peek_val __caml_parser_env 0 : 'match_exp) in
    Obj.repr(
# 53 "parser.mly"
                        (_1::_2)
# 340 "parser.ml"
               : 'match_exp))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 0 : 'match_case) in
    Obj.repr(
# 54 "parser.mly"
             ( [_1])
# 347 "parser.ml"
               : 'match_exp))
; (fun __caml_parser_env ->
    let _2 = (Parsing.peek_val __caml_parser_env 2 : Ast.pattern) in
    let _4 = (Parsing.peek_val __caml_parser_env 0 : 'funexp) in
    Obj.repr(
# 57 "parser.mly"
                                         ( (_2,_4))
# 355 "parser.ml"
               : 'match_case))
; (fun __caml_parser_env ->
    let _1 = (Parsing.peek_val __caml_parser_env 1 : 'funexp) in
    Obj.repr(
# 62 "parser.mly"
                               ( _1)
# 362 "parser.ml"
               : Ast.exp))
(* Entry main *)
; (fun __caml_parser_env -> raise (Parsing.YYexit (Parsing.peek_val __caml_parser_env 0)))
|]
let yytables =
  { Parsing.actions=yyact;
    Parsing.transl_const=yytransl_const;
    Parsing.transl_block=yytransl_block;
    Parsing.lhs=yylhs;
    Parsing.len=yylen;
    Parsing.defred=yydefred;
    Parsing.dgoto=yydgoto;
    Parsing.sindex=yysindex;
    Parsing.rindex=yyrindex;
    Parsing.gindex=yygindex;
    Parsing.tablesize=yytablesize;
    Parsing.table=yytable;
    Parsing.check=yycheck;
    Parsing.error_function=parse_error;
    Parsing.names_const=yynames_const;
    Parsing.names_block=yynames_block }
let main (lexfun : Lexing.lexbuf -> token) (lexbuf : Lexing.lexbuf) =
   (Parsing.yyparse yytables 1 lexfun lexbuf : Ast.exp)
;;
